#ifndef __AHT20_H_
#define __AHT20_H_

#include <stdio.h>
#include <string.h>
#include <stdint.h>

#define ATH20_SLAVE_ADDRESS     0x38        /*默认I2C从机地址 */

//****************************************
// 定义 AHT20 内部地址
//****************************************
#define AHT20_STATUS_REG        0x00    //状态字 寄存器地址
#define AHT20_INIT_REG          0xBE    //初始化 寄存器地址
#define AHT20_SoftReset         0xBA    //软复位 单指令
#define AHT20_TrigMeasure_REG   0xAC    //触发测量 寄存器地址

/***************************
 * 函数名:数据发送函数类型
 * 参数1：dev_addr  传感器地址+读写位(读1写0)
 * 参数2：reg_addr  寄存器地址
 * 参数3：*data    数据指针
 * 参数4：len          指针中的数据长度
 * 返回值：
 * 作者:
 * 说明: 需要定义此类型的IIC数据发送函数，函数中实现将设备地址,寄存器地址及数据发送到IIC总线上。
 * **************************/
typedef void (*AHT20_Write_Data_callback)(uint8_t dev_addr, uint8_t reg_addr, const uint8_t *data, uint16_t len);

/***************************
 * 函数名:数据读取函数类型
 * 参数1：dev_addr  传感器地址+读写位(读1写0)
 * 参数2：reg_addr  寄存器地址
 * 参数3：*data    数据指针
 * 参数4：len          需要读取的数据长度
 * 返回值：
 * 作者:
 * 说明: 需要定义此类型的IIC数据发送函数，函数中实现将设备地址,寄存器地址及数据发送到IIC总线上。
 * **************************/
typedef void (*AHT20_Read_Data_callback)(uint8_t dev_addr,  uint8_t reg_addr, const uint8_t *data, uint16_t len);

/* ms 级延时函数 */
typedef void (*AHT20_delay_ms_callback)(uint32_t ms);

typedef struct AHT20_init {
    uint8_t iic_addr; /* 7bit address */
    AHT20_Write_Data_callback wd_cb;
    AHT20_Read_Data_callback rd_cb;
    AHT20_delay_ms_callback delay_ms_cb;
} AHT20_init_t;

typedef struct AHT20_data
{
    float RH;       // 湿度，转换单位后的实际值，标准单位%
    float Temp;     // 温度，转换单位后的实际值，标准单位°C
} AHT20_data_t;

/**
  * @brief  AHT20初始化函数
  * @param  init_conf 初始化结构体
  * @retval 0：OK，other Failed。
  */
uint8_t AHT_Init(AHT20_init_t init_conf);   //初始化AHT10

/**
  * @brief  AHT20 设备读取 相对湿度和温度（原始数据20Bit），直接触发转换并阻塞等待读取
  * @param  rd_data ：读取到的数据
  * @retval uint8_t：0:读取数据正常; -1:读取设备失败
  */
uint8_t AHT20_ReadHT(AHT20_data_t *rd_data);

/**
  * @brief  AHT20 触发测量命令
  * @param  void
  * @retval void
  */
void AHT20_TrigMeasureCmd(void);

/**
  * @brief  AHT20 设备读取 相对湿度和温度（原始数据20Bit），判断转换是否完成，如果未完成则退出, 调用前需要发送触发命令。
  * @param  rd_data ：读取到的数据
  * @retval uint8_t：0:读取数据正常; -1:读取设备失败
  */
uint8_t AHT20_ReadHT_noblock(AHT20_data_t *rd_data);

#endif

